
Crontab = { // ct : Crontab 简写
    isDevelopmentModel : false, // 标志是开发版 在次版本下会有错误提示[只有中文提示]
    isClearDiv : true, // 标志着上一个div的内容将被清空
    isSingleton : true, // 单例模式
    Properties : { // 属性
        divID : null,
        divObj : null,
        ctContent : "", // 暂时没有用到
        showParam : "daily",
        divPrefix : "auto", // 前缀
        divSuffix : "auto"  // 后缀
    },
    Data : {
        datas : function (){
            var ds = new Array(); // 数组顺序不能变 这是Spring定时器的时间顺序
            ds["seconds"] = "0";
            ds["minutes"] = "*";
            ds["hours"] = "*";
            ds["day"] = "*";
            ds["month"] = "*";
            ds["week"] = "*";

            return ds;
        },
        dataKeys : function (){
            var ds = [
                     "seconds",
                     "minutes",
                     "hours",
                     "day",
                     "month",
                     "week"
            ];

            return ds;
        },
        get : {
            getData : function (){ // 注释掉的代码都是定义后系统暂时用不着的
                var showType = "";
                if(Crontab.isSingleton){ // 多例模式下 用的是临时变量
                    showType = Crontab.Properties.showParam;
                }else{
                    showType = Crontab.showTypeTemp;
                    Crontab.showTypeTemp = "";
                }


                var ctData = Crontab.Data.datas();
                var ctDataKeys = Crontab.Data.dataKeys();

//                var seconds = "";
//                var minutes = "";
//                var hours = "";
                var time = "";
                var day = "";
//                var month = "";
                var week = "";

                if(SU.get(Crontab.Method.getDomId("txtTime"))){
                    time = SU.get(Crontab.Method.getDomId("txtTime")).value;
                }

                if(SU.get(Crontab.Method.getDomId("sDay"))){
                    day = SU.get(Crontab.Method.getDomId("sDay")).value;
                }
//                if(SU.get(Crontab.Method.getDomId("sMonth"))){
//                    month = SU.get(Crontab.Method.getDomId("sMonth").value;
//                }
                if(SU.get(Crontab.Method.getDomId("sWeek"))){
                    week = SU.get(Crontab.Method.getDomId("sWeek")).value;
                }

                var treatmentTime = function (){
                    if(!time){
                        return;
                    }
                    var strs = time.split(":");
                    ctData["hours"]   = strs[0].trimLeft("0",1);
                    ctData["minutes"] = strs[1].trimLeft("0",1);
                };

                var springTimeStr = "";
                if(showType == "daily"){ // 0 0 0 * * ? 每天
                    treatmentTime();
                    ctData["week"] = "?";
                }
                if(showType == "weekly"){ // 0 0 0 ? * [1-7] 每周
                    treatmentTime();
                    ctData["day"] = "?";
                    ctData["week"] = week;
                }
                if(showType == "monthly"){ // 0 0 0 [1-31|L] * ? 每月
                    treatmentTime();
                    ctData["day"] = day;
                    ctData["week"] = "?";
                }

                for(var i=0; i<ctDataKeys.length; i++ ){
                    springTimeStr += (ctData[ctDataKeys[i]]+" ");
                }
                return springTimeStr;
            }
        }
    },
//    ArrayData : { // 如果不需要国际化的话 直接使用该属性即可
//        timeType : [
//           "每天", "每周", "每月"
//        ],
//        month : [ "1月", "2月", "3月"
//        ],
//        week : [ "星期一", "星期二", "星期三" ],
//        day : ["1号" ,"2号" ,"3号" ]
//    },
    Method : {
        initTimeTypeSelect : function (){ // 方法以 init 开头 的都是 初始化方法
            var str = "";
            str += "<select id='"+Crontab.Method.getDomId("sTimeType")+"' ";
            str += "onchange='Crontab.show(this.value";
            if(!Crontab.isSingleton){
                str += ",\""+Crontab.Properties.divID+"\"";
            }
            str += ");'>";

            var tyleCase = function (parameters){
                switch(parameters){
                    case 0:
                         return "all";
                    break;
                    case 1:
                         return "daily";
                    break;
                    case 2:
                         return "weekly";
                    break;
                    case 3:
                         return "monthly";
                    break;
                }
            };
            var stt = Crontab.Properties.showParam;
            if(!Crontab.isSingleton){
                stt = Crontab.showTypeTemp;
                Crontab.showTypeTemp = "";
            }

            for(var i=0; i<Crontab.ArrayData.timeType.length; i++){
                str += "<option value='" + tyleCase(i+1) + "'";
                if(tyleCase(i+1) == stt){
                    str += " selected='selected' ";
                }
                str += " >";
                str += Crontab.ArrayData.timeType[i];
                str += "</option>";
            }
            str += "</select>";
            return str;
        },
        initMonthSelect : function (){
            var str = "";
            str += "<select id='"+Crontab.Method.getDomId("sMonth")+"' >";
            for(var i=0; i<Crontab.ArrayData.month.length; i++){
                str += "<option value='" + i + "'>";
                str += Crontab.ArrayData.month[i];
                str += "</option>";
            }
            str += "</select>";
            return str;
        },
        initWeekSelect : function (){
            var str = "";
            str += "<select style='width:66px;' id='"+Crontab.Method.getDomId("sWeek")+"' >";
            for(var i=0; i<Crontab.ArrayData.week.length; i++){
                var week = Crontab.ArrayData.week[i];
                str += "<option value='" + week.key + "'>";
                str += week.value;
                str += "</option>";
            }
            str += "</select>";
            return str;
        },
        initDaySelect : function (){
            var str = "";
            str += "<select style='width:77px;' id='"+Crontab.Method.getDomId("sDay")+"'>";
            for(var i=1; i<=Crontab.ArrayData.day.length; i++){
                if(i == 32){
                    str += "<option value='L'>";
                }else{
                    str += "<option value='" + i + "'>";
                }

                str += "" + Crontab.ArrayData.day[i-1] + "";
                str += "</option>";
            }

            str += "</select>";
            return str;
        },
        initTimeSelect : function (){
            var str = "<input id='"+Crontab.Method.getDomId("txtTime")+"' style='margin-top:-5px;font-size:14px;' value='00:00' size='4' onclick='WdatePicker({dateFmt:\"HH:mm\"})''>";
            return str;
        },
        initDiv : function (id){ // 简单的初始化Div
            if (!Crontab.isSingleton) { // 当开启多例模式的时候 这些方法禁用
                if (Crontab.isDevelopmentModel) {
                        alert("在多例模式下,该方法禁用.!");
                }
                return ;
            }

            Crontab.reload(); // 还原为初始值

            if(!id){
                if (Crontab.isDevelopmentModel) {
                    alert("initDiv参数不能为空!");
                }
                return ;
            }

            Crontab.Properties.divID = id;
            Crontab.Properties.divObj = SU.get(id);
            // 自动生成存在BUG 它在一定的几率下可能会生成两个相同的前缀  但是几率很小
            // 该值是为 以后显示多个实例化做的准备
            // 现在该值不会用到
//            Crontab.Properties.divPrefix = "div" + parseInt(Math.random()*100000);
            Crontab.show(Crontab.Properties.showParam);

        },
        /**
         *
         * @param {Object} id
         * @param {Object} reverseDisplayStr : Reverse Display 逆向显示
         */
        initCrontab : function (id,reverseDisplayStr){
            if(arguments.length == 2){ // "0 * * * * ?"
                var rds = reverseDisplayStr.trim().split(" ");
                if(rds.length == 6){
                    // 验证 省略...........

                    if(rds[1].length == 1){
                        rds[1] = "0" + rds[1];
                    }
                    if(rds[2].length == 1){
                        rds[2] = "0" + rds[2];
                    }
                    var time = rds[2] + ":" + rds[1];

                    switch(rds[3]){
                        // 0 0 0 * * ? 每天
                        case "*" :
                            Crontab.Method.init(id,"daily"); // 初始化 Crontab
                            SU.get(Crontab.Method.getDomId("txtTime")).value = time;
                        break;
                        // 0 0 0 ? * [1-7] 每周
                        case "?" :
                            Crontab.Method.init(id,"weekly"); // 初始化 Crontab
                            SU.get(Crontab.Method.getDomId("txtTime")).value = time;
                            SU.get(Crontab.Method.getDomId("sWeek")).value = rds[5];
                        break;
                        // 0 0 0 [1-31|L] * ? 每月
                        default :
                            Crontab.Method.init(id,"monthly"); // 初始化 Crontab
                            SU.get(Crontab.Method.getDomId("txtTime")).value = time;
                            SU.get(Crontab.Method.getDomId("sDay")).value = rds[3];

                    }
                }else{
                    if (Crontab.isDevelopmentModel) {
                        alert("Reverse Display 格式不正确!");
                    }
                }

            }else{
                if (Crontab.isDevelopmentModel) {
                    alert("initCrontab参数不全!");
                }
            }
        },
        /**
         *
         * @param {Object} div id
         * @param {Object} showType 初始化时显示的值
         * @param {Object} reverseDisplayStr : Reverse Display 逆向显示
         */
        init : function (id,showType,reverseDisplayStr){
            if (!Crontab.isSingleton) { // 当开启多例模式的时候 这些方法禁用
                if (Crontab.isDevelopmentModel) {
                        alert("在多例模式下,该方法禁用.!");
                }
                return ;
            }


            Crontab.reload(); // 还原为初始值

            var boo = true;
            var setDiv = function (){
                if(SU.type(id) == "String"){
                    Crontab.Properties.divID = id;
                    Crontab.Properties.divObj = SU.get(id);
                }else{
                    boo = false;
                    if (Crontab.isDevelopmentModel) {
                        alert("参数无效,原因是该参数是一个" + SU.type(id) + "!");
                    }
                }
            };
            if(arguments.length > 0){

                if(arguments.length == 1){
                    setDiv();
                    if(boo){
                        Crontab.show(Crontab.Properties.showParam); // 显示DIV
                    }else{
                        return;
                    }
                }

                if(arguments.length == 2){
                    setDiv();
                    Crontab.Properties.showParam = showType;
                    if(boo){
                        Crontab.show(Crontab.Properties.showParam); // 显示DIV
                    }else{
                        return;
                    }
                }



            }else{
                if (Crontab.isDevelopmentModel) {
                    alert("init参数不能为空!");
                }
                return ;
            }
        }
    },
    show : function (parameters,id){ // 该方法可以显示Select控件 并返回传入的值
        if(typeof(id) != "undefined"){
               var cs = Crontab.Data.cs[id];
               Crontab.Properties.divID = cs.id;
               Crontab.Properties.divObj = SU.get(id);
               Crontab.Properties.divPrefix = cs.divPrefix;
               Crontab.Properties.divSuffix = cs.divSuffix;
        }
        if(Crontab.isSingleton){
            Crontab.Properties.showParam = parameters;
        }else{
            Crontab.showTypeTemp = parameters;
        }

        if(!Crontab.Properties.divID && !Crontab.Properties.divObj){ // 判断id或者对象是否存在
            if (Crontab.isDevelopmentModel) {
                alert("在调用该方法前请现行设置divID 或者是传入div 对象");
            }
            return;
        }


        var ctContent = ""; // 初始化控件字符串

        var all = function (){ // 显示所有的控件 但是不包括类型
            ctContent += Crontab.Method.initTimeTypeSelect();
            ctContent += "&nbsp;&nbsp;&nbsp;&nbsp;";
            ctContent += Crontab.Method.initMonthSelect();
            ctContent += "&nbsp;&nbsp;&nbsp;&nbsp;";
            ctContent += Crontab.Method.initDaySelect();
            ctContent += "&nbsp;&nbsp;&nbsp;&nbsp;";
            ctContent += Crontab.Method.initWeekSelect();
            ctContent += "&nbsp;&nbsp;&nbsp;&nbsp;";
            ctContent += Crontab.Method.initTimeSelect();
        };

        var daily = function (){ // 每天
            ctContent += Crontab.Method.initTimeTypeSelect();
            ctContent += "&nbsp;&nbsp;&nbsp;&nbsp;";
            ctContent += Crontab.Method.initTimeSelect();
        };
        var weekly = function (){ // 每星期
            ctContent += Crontab.Method.initTimeTypeSelect();
            ctContent += "&nbsp;&nbsp;&nbsp;&nbsp;";
            ctContent += Crontab.Method.initWeekSelect();
            ctContent += "&nbsp;&nbsp;&nbsp;&nbsp;";
            ctContent += Crontab.Method.initTimeSelect();
        };
        var monthly = function (){ // 每月
            ctContent += Crontab.Method.initTimeTypeSelect();
            ctContent += "&nbsp;&nbsp;&nbsp;&nbsp;";
            ctContent += Crontab.Method.initDaySelect();
            ctContent += "&nbsp;&nbsp;&nbsp;&nbsp;";
            ctContent += Crontab.Method.initTimeSelect();
        };

        try{
            eval(parameters + "();"); // 执行相应的方法

            if(!Crontab.Properties.divObj){ // 如果div对象不存在 就通过div的ID 来获得该对象
                Crontab.Properties.divObj = SU.get(Crontab.Properties.divID);
                if(!Crontab.Properties.divObj){ // 判断对象是否存在
                    if (Crontab.isDevelopmentModel) {
                        alert("您指定的Div不存在,初始化失败!");
                    }
                    return ;
                }
            }

            Crontab.Properties.divObj.innerHTML = ctContent; // 显示控件
        }catch(e){
            if (Crontab.isDevelopmentModel) {
                alert("您指定的参数不存在![daily,weekly,monthly]");
            }
        }

        return parameters; // 返回传入值 可以方便用户查询当前调用了哪个方法
    },
    reload : function (){ // 重新初始化变量 initDiv|init 方法对其进行了调用
        if(Crontab.isClearDiv){
            if(Crontab.Properties.divObj){ // 清空DIV
                Crontab.Properties.divObj.innerHTML = "";
            }
            Crontab.Properties = Crontab.Data.Properties;
        }
    }
};
/**
 * 获得 元素的完整ID
 * @param {Object} id
 */
Crontab.Method.getDomId = function (id){
    return Crontab.Properties.divPrefix + id + Crontab.Properties.divSuffix;
};
Crontab.Data.Properties = { // 属性
            divID : null,
            divObj : null,
            ctContent : "", // 暂时没有用到
            showParam : "daily",
            divPrefix : "auto", // 前缀  如果初始化没有指定 该前缀自动生成
            divSuffix : "auto"  // 后缀  暂时没有用到
        }; // 保留一个备份
Crontab.Data.cs = []; // cs : Crontab's 通过Key-Value 来存储Crontab
Crontab.showTypeTemp = "";

Crontab.Method.addCrontab = function (divId,prefix,suffix,showType){ // 实现多例模式
    if (Crontab.isSingleton) { // 当开启多例模式的时候 这些方法禁用
        if (Crontab.isDevelopmentModel) {
                alert("在单例模式下,该方法禁止使用.!");
        }
        return ;
    }

    if(arguments.length == 0){
        if (Crontab.isDevelopmentModel) {
                alert("至少传入一个div id.!");
        }
        return ;
    }

    if(arguments.length == 1){
        Crontab.Properties.divPrefix = divId;
    }
    if(arguments.length >= 2){
        Crontab.Properties.divPrefix = prefix;
        Crontab.Properties.divSuffix = suffix;
    }
    if(typeof(showType) != "undefined"){
        Crontab.Properties.showParam = showType;
    }


    Crontab.Properties.divID = divId ;
    Crontab.Properties.divObj = SU.get(divId);

    Crontab.show(Crontab.Properties.showParam); // 显示DIV
    Crontab.Data.cs[divId] = { // 保存该DIV状态
        id : divId,
        divPrefix : Crontab.Properties.divPrefix,
        divSuffix : Crontab.Properties.divSuffix
    };
    Crontab.Properties = Crontab.Data.Properties; // 初始化

};

Crontab.Data.get.getDataByKey = function (id){ // 通过divId 获得当前div的Crontab数据
    var cs = Crontab.Data.cs[id]; // 获得当前div 的基本信息

    Crontab.Properties.divID = cs.id;           // 改变控件的基本信息
    Crontab.Properties.divPrefix = cs.divPrefix;
    Crontab.Properties.divSuffix = cs.divSuffix;

    // 获得当前div是显示 每天 每周 还是每月
    var showType = SU.get(Crontab.Method.getDomId("sTimeType")).value;
    Crontab.showTypeTemp = showType;
    return Crontab.Data.get.getData(); // 得到指定控件的值
};

Crontab.Method.initAddCrontab = function (id,reverseDisplayStr){
    Crontab.isClearDiv = false;
    Crontab.isSingleton = false;
    
    if(arguments.length == 2){ // "0 * * * * ?"
        var rds = reverseDisplayStr.trim().split(" ");
        if(rds.length == 6){
            // 验证 省略...........

            if(rds[1] == "0"){
                rds[1] = "00";
            }
            if(rds[2] == "0"){
                rds[2] = "00";
            }
            var time = rds[2] + ":" + rds[1];
            switch(rds[3]){
                // 0 0 0 * * ? 每天
                case "*" :
                    Crontab.Method.addCrontab(id,id,"","daily"); // 初始化 Crontab
                    SU.get(id+"txtTime").value = time;
                break;
                // 0 0 0 ? * [1-7] 每周
                case "?" :
                    Crontab.Method.addCrontab(id,id,"","weekly"); // 初始化 Crontab
                    SU.get(id+"txtTime").value = time;
                    SU.get(id+"sWeek").value = rds[5];
                break;
                // 0 0 0 [1-31|L] * ? 每月
                default :
                    Crontab.Method.addCrontab(id,id,"","monthly"); // 初始化 Crontab
                    SU.get(id+"txtTime").value = time;
                    SU.get(id+"sDay").value = rds[3];

            }
        }else{
            if (Crontab.isDevelopmentModel) {
                alert("Reverse Display 格式不正确!");
            }
        }

    }else{
        if (Crontab.isDevelopmentModel) {
            alert("initCrontab参数不全!");
        }
    }
};

/**
 * 重构该 克隆表达式 向对象化发展
 * 没有错误提示
 * 不支持 多个实例化
 * [可以将需要属性存储的东西放在 对象本身.调用的时候重新给ct赋值即可]
 */
var Crontabs = function (divId,val){
    /*****私有属性******/
    var this_ = this;
    var ct = Crontab;
    var stu = {} ; // 持续时间控件
    var stt = {};

    if(arguments.length < 1){

        return ct;
    }

    /*****对象属性******/
    this.divId = divId;
    /*****对象方法******/

    /**
     * 显示克隆表达式控件
     * @param {Object} divId
     */
    this.show = function (){
        ct.Method.initDiv(this.divId);
    };
    this.reversal = function (rl){ // 可以单个为 回显方法赋值
        if(rl){
            val = rl;
        }
        ct.Method.initCrontab(this.divId,val.trim());
    };

    if (val) { // 自动显示
        this.reversal();
    }
    else {
        this.show();
    }

    /**
     * 克隆表达式控件返回值
     */
    this.results = function (){
        return ct.Data.get.getData();
    };

    /**
     * 表明要与 持续时间控件进行兼容
     * 要重写 绑定
     * @param {Object} tu
     */
    this.setTU = function (tu){
        stu = tu;

        var sTimeType = ct.Method.getDomId("sTimeType");
        stt = SU.get(sTimeType);

        stt.onchange = function (){
            ct.show(this.value);
            this_.setTU(tu);
        };
        switch(stt.selectedIndex){
            case 0:
                var day = tu.setDayDisable(true);
                day.value = "0";
            break;
            case 1:
                var day = tu.setDayDisable(false);
                day.onkeyup = function (){
                    if (parseInt(tu.results()) > 7 * 24 * 60 * 60) {
                        alert(this_.Message.checkDay.weekMsg);
                    }
                };
            break;
            case 2:
                var day = tu.setDayDisable(false);
                day.onkeyup = function (){
                    if(parseInt(tu.results()) > 31*24*60*60){
                        alert(this_.Message.checkDay.monthMsg);
                    }
                };
            break;
        }
    };

    /**
     * 验证用户是否选择了查过了指定持续时间
     */
    this.checkDay = function (){
        if(stt.value == "weekly" && stu.results() > 7*24*60*60){
            alert(this_.Message.checkDay.weekMsg);
            return false;
        }
        if(stt.value == "monthly" && stu.results() > 31*24*60*60){
            alert(this_.Message.checkDay.monthMsg);
            return false;
        }

        return true;
    };
};


